package com.xyzwps.collections;

public interface Collection<E> {
    /**
     * <p>容器中元素的数量。
     * <p>注：为使文档简洁，我们会用字母 n 来表示容器中元素的数量。
     */
    int size();

    /**
     * 判断容器中元素个数是否是 0。
     */
    default boolean isEmpty() {
        return this.size() == 0;
    }

    /**
     * 判断容器中元素个数是否大于 0。
     */
    default boolean isNotEmpty() {
        return !isEmpty();
    }

    /**
     * 添加一个元素到 {@link Collection} 中。
     * <p>
     * 如何添加由实现决定。
     */
    void add(E element);

    /**
     * Java {@code c.add(e)} is equivalent to
     * Groovy {@code c << e}
     */
    default void leftShift(E element) {
        this.add(element);
    }

    /**
     * 清除列表中的所有元素。
     */
    void clear();

    /**
     * 判断指定元素是否存在于列表中。
     */
    boolean has(E element);

    /**
     * Java {@code c.has(e)} is equivalent to
     * Groovy {@code e in c}
     */
    default boolean isCase(E element) {
        return this.has(element);
    }

    static <E> Collection<E> emptyCollection() {
        return new Collection<E>() {
            public int size() { return 0; }
            public void add(E element) { throw new UnsupportedOperationException(); }
            public void clear() { }
            public boolean has(E element) { return false; }
        };
    }
}
